#ifndef MYSHM_H

#define MYSHM_H

#define SHM_KEY 1001

#define SHM_KEY_CTL 2001

#define SHM_KEY_SET 3001


typedef struct
{
    unsigned int SLAVE_Add;    //device address
    unsigned int W_ValveState[8];  //7-8 
    unsigned int T_ValveState[6];
    unsigned int N_ValveState[6];
    float Vot_24V0;
    float Vot_15V0;
    float Vot_5V0;
    float Vot_3V3;
    float Temperature;
    unsigned char FanState;
    unsigned char PumpState;
    unsigned char FanState_24V;
    unsigned char Fflag;  //1:由上位机控制T4阀状态，0:由接口板自行控制

}bdinterface;
extern bdinterface BD_Interface;
typedef struct
{
    unsigned char SLAVE_Add;
    unsigned short IS_ENABLE;
    float Vot_Set;
    float Vot_Read;
    float Temp_Set;
    float Temp_Read;
}bdozonator;

typedef struct
{
    unsigned char SYS_CTL_MODE;    // 1： 手动模式，下面两个结构体的内容由界面改写，实时生效    0：自动控制模式。硬件设备状态由底层控制
    bdinterface BD_Interface;      //手动模式下控制接口板的所有状态
    bdozonator BD_Ozonator;       // 手动模式下控制臭氧板的所有状态
    bdozonator BD_Photometer;
    
    int Communicat_updata;  //通讯配置是否更新 1：配置有更改 0：配置无更改  11

    int Sys_Gas_Sel;     //气体选择 0：无  1-6：气体编号
    int Sys_Span_Sel;   // 0: 无   1-6：跨度选择 7：手动
    int Sys_Ozo_Sel;   // 0：关闭  1-5：跨度  6：手动 
    int GasFlow_Mode;  // 0: 待机 1： 运行 2. 零气流量校准 3. 标气流量校准  4.光度计灯设置  5.光强检查
    
    int PhotoMeter_Mode;    //光度计标志位  0：关闭  1：光度计强度  2：光度计外部  3：光度计控制

    int Para_Save;     //当有系统设置改变时，设置此位为1，完成参数保存时会自动清除
    int Cal_Span_Sel;  //流量校准区间选择 1->5%  2->20%  ...
    int GasFlow_Cal_Valve;  //标气流量校准电磁阀  采用统一编号 (1-6:内部电磁阀1-6) (7-12:三通阀1-6)  (13-20:外部电磁阀1-7)
    // 以下所有变量界面程序只可以读不能写，底层会根据上面的配置自动计算。
    float Zero_Flow;    //零气流量  
    float AirFlow;     //标气流量
    float Total_Flow;    //总流量
    float Target_Consentration;    //目标浓度
    float Air_Consentration;      //钢瓶气浓度
    int Air_Valve;     // 标气电磁阀
    int Zero_Valve;    // 零气电磁阀
    int ResetDefault;  //置1 恢复出厂设置

    //增加臭氧浓度
    float Ozo_Consentation; //ug/m3
    float Ozo_Ppm; //臭氧浓度ppm
    float Show_Ozo;     //显示臭氧浓度
   
    float Sam_Ozo;      //校准时标气浓度
    float Sam_Pressure;     //校准时输入的压力
    float Air_Sam_Temp;     //校准时输入的环境温度
    float Sam_Temp;         //校准时输入的光池温度

    int Ozo_Cal_Flag;       //校准背景值和系数标志
    int Air_Pressure_Cal_Flag;      //压力校准标志
    int Air_Temp_Cal_Flag;      //环境温度校准
    int Phot_Temp_Cal_Flag;     //光池温度校准标志

}systemctl;     //设备控制结构体
typedef struct
{
    char gasname[20];    //气体名称 最长20字符   
    int gasValve;    //气体电磁阀   采用统一编号 (1-6:内部电磁阀1-6) (7-12:三通阀1-6)  (13-20:外部电磁阀1-7)
    float gasconcentration;   //钢瓶气体浓度   单位sccm
    float zeroairflow;  // 零气流量控制器浓度   单位：slm
    float gasconcentration_span[7];  //气体浓度跨度1-7    单位：sccm
    float totalflow_span[7];    // 总流量跨度 1-7     单位： slm
}gastemplate;
typedef struct
{
    unsigned char add;     //地址
    float Abs_Pres;        //绝对压力
    float Temperature;     //温度
    float Volume_Flow;     //体积流量
    float Mass_Flow;       //质量流量
    float Mass_Flow_Set;    //设定质量流量
    char gastype[20];      //当前气体
}mfctemplate;

typedef struct
{
    float cal_5_FS;     //校准时用户输入的值   质量流量
    float cal_20_FS;
    float cal_35_FS;
    float cal_50_FS;
    float cal_65_FS;
    float cal_80_FS;
    float cal_95_FS;

    float cal_5_FS_V;     //校准时用户输入的值 体积流量
    float cal_20_FS_V;
    float cal_35_FS_V;
    float cal_50_FS_V;
    float cal_65_FS_V;
    float cal_80_FS_V;
    float cal_95_FS_V;
}mfccaltemplate;
typedef struct
{
    int Init_Sta;
    int IS_RUNING;
    int BD_Int_IsPresent;
    int BD_Ozo_IsPresent;
    int BD_Phot_IsPresent;

    int MFC_Zero_IsPresent;
    int MFC_Air_IsPresent;
    int RevCnt;
    int Rev_Sta;
    float CPU_Temp;
    float Ozo_TempRead;
    float Ozo_VotRead;
    int Ozo_Enable;

    float Phot_TempRead;    //光度计温度
    float Phot_VotRead;     //光度计电压
    int Phot_Enable;        //光度计使能

    unsigned int Int_Valves;
    unsigned int Int_W_Valves[8];   //７－８　外部电磁阀增加
    unsigned int Int_N_Valves[6];
    unsigned int Int_T_Valves[6];
    int Int_Fanstatus;
    int Int_Fanstatus_24V;
    int Fflag;

    int Int_Pumpstatus;     //泵状态
    // float Int_24V0;
    // float Int_15V0;
    // float Int_5V0;
    float Int_3V3;
    float Int_Temp;
    
    float Int_18V0;
    float Int_15V0;
    float Int_N15V0;
    float Int_24V0;
    float Int_5V0;
    float Int_flow;         //流量
    float Air_Pressure;     //大气压
    float Int_Temp1;            //温度
    float Int_Temp2;
    float Int_Temp3;


    float MFC_Zero_PostCal;     //界面显示的流量，经过了校准
    float MFC_Air_PostCal;

    mfctemplate MFC_Zero;
    mfctemplate MFC_Air;

     /***增加***/
    //float Ozo_Con[8];     //臭氧浓度
    float PHOT_Noise_Gas;  //参比气光强噪声
    float PHOT_Noise_Ozo;  //臭氧光强噪声
    float Light_Data[2];   //光强原始值
    float Light_Data_Avg[2]; //光强平均值

    int FREQAveflag;        //平均数据切换标志
    int T4_Valve_Status;    //三通阀4状态 1：参比气  0：臭氧

    float Ozo_Ppm;          //显示的臭氧浓度
    float Show_Ozo_Ppm;          //显示的臭氧浓度2
}sysstatus;

typedef struct
{
    int boundrate; // 0-9600 1-1200 2-2400 3-4800 4-19200 5-38400 6-57600 7-115200
    int databit;   //数据位  0-8 或者 1-5 2-6 3-7
    int parity;   //0-none 1-odd 2-even 3-mark 4-space
    int stopbit;   //0-1 1-1.5 2-2   
}serialopt;
typedef struct
{
    int intervel;  //时间间隔  单位 ：s
    int add_label; //添加标签 0-N 1-Y
    int timestrip;  //时间戳 0-N 1-Y
    int addflag; //添加标志 0-N 1-Y
    int itemcfg[8];   //项目配置 每一个元素对应一个项目 其值对应 0-O3浓度 1-气体浓度 。。。 10-外部报警 11-环境温度

}dataframeopt;
typedef struct
{
    char ip[20];   //ex： “192.168.72.3”
    char mask[20];  //0-8 1-16 2-24
    char gateway[20]; //ex "192.168.72.1" 
    char serverip[20]; //ex "192.168.72.67"
    char NTPserverip[20]; //ex "192.168.72.67" 
    char Host_Name[20];
    int Is_DHCP;     //0-no  1-yes
    int port;           //绑定端口号
    int tcp_change_flag;
    int mode;           //0:客户端模式  1:服务器模式  
    int Flag_Tcp[10];   //0:是否启用网络通讯(0:不启用 1:启用)
    
}tcpipcfg;
typedef struct
{
    serialopt Serial_Opt;   //串口设置
    char instrument_identity[30]; //仪器识别号
    char series_number[30];   //系列号
    int communicate_procotol;  //通讯协议 0-clink 1-gesyctec 2-leads 3-modbus 4-stream
    int Com_Bus_Sel;  //通信选择　０-232 1-485
    dataframeopt DataFrame_Opt;  //数据流配置

}commuset;
typedef struct
{
    int IS_Init;
    unsigned int ReadInterval;    //读取间隔  单位ms  暂无需关注
    unsigned int boundrate;       //波特率 暂无需关注
    unsigned int DataAvgTime;     //数据平均时间   暂无需关注
    unsigned int AppVersion;      //软件版本 暂无需关注
    unsigned int configcrc;       //暂无需关注 
    unsigned int DataLog_InterVal;   // 数据记录间隔  暂无需关注
    unsigned int Ozonator_Add;  //臭氧板地址  无需关注
    unsigned int Interface_Add;    //接口板地址   无需关注
    unsigned int IS_OZO_ENABLE;  // 臭氧板使能
    
    /***增加***/
    unsigned int PHOT_ENABLE;   //光度计使能
    
    float ZeroMFC_Range;  // 零气控制器 单位：slm
    float GasMFC_Range;   // 标气控制器 单位：slm
    gastemplate Gas[6];   // 三种气体的设置
    mfccaltemplate MFC_Zero_Cal;  //零气流量校准
    mfccaltemplate MFC_Air_Cal;  //零气流量校准
    float Display_Contrast;   //显示对比度
    float Ozo_Span[8];    //臭氧灯百分比 自己定义顺序和含义，底层不使用
    float Phot_Span;    //光度计百分比
    float Set_Ozo_Con[8];      //手动输入的臭氧浓度


    float Ozo_ZeroAir;    //臭氧零气
    int BoolFlag[24];     //设定记录项  多余出来的备用
    float BenchTemp_H;    //环境温度上下限
    float BenchTemp_L;   
    float OzoTemp_H;      //臭氧温度上下限
    float Ozotemp_L;

    float PhotTemp_H;      //光度计温度上下限
    float PhotTemp_L;
    
    float Light_Data_H;     //光强上下限
    float Light_Data_L;
    
    float Light_Cell_H;     //光池温度上下限
    float Light_Cell_L;

    int Gas_Num;   //支持气体数量
    // int Com_Bus_Sel;  //通信选择　０-232 1-485
    int Phot_Cfg;
    char password[10];  //密码
    int Lock_Status;   //锁定标志
    int Sys_Language;  //系统语言
    tcpipcfg Tcp_Cfg[2];  //　ip 设置
    float Back_light_ratio;   //显示亮度　０－１００

    int Sys_Mode;   //2021.6.5　系统模式
    int Sys_Gas_Sel;   //2021.6.5 气体选择
    int Sys_Span_sel;   //2021.6.5 等级选择
    int Sys_Ozo_Sel;    //2021.6.5 臭氧
    int Sys_Only_Ozo;   //2021.6.5 单独臭氧模式？
    
    int Temp_int_Flag[10];   //2021.6.5  可临时使用的掉电保存项
    float Temp_float_Value[10];  //2021.6.5 　可临时使用的掉电保存项
    commuset CommuSet;      //111

    int Avg_Time;       //平均时间下标
    float Phot_Range[4];   //光度计量程0:设置量程  1、2、3:自定义量程
    //增加O3背景值和系数
    float Ozo_K;        //系数
    float Ozo_B;        //背景值
	
	float Pressure_K;
    float Pressure_B;
	
	float Phot_Temp_K;  //光池温度系数
    float Phot_Temp_B;
	
	float Air_Temp_K;
    float Air_Temp_B;   //环境温度系数
    int Sys_Run[10];        //协议运行标志
}sysset;



sysstatus* GetSysStatus(void);

float Get_CpuTemp(void);

sysstatus* Init_Shm(void);

systemctl* Init_Shm_Ctl(void);

sysset* Init_Shm_Sysset(void);

void close_sharememory(void *pshare);



#endif

